package cn.iocoder.yudao.module.reading.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI服务测试工具类
 * 用于测试OpenRouter API连接和配置
 *
 * @author 芋道源码
 */
@Slf4j
public class AiServiceTestUtil {

    /**
     * 测试OpenRouter API连接
     */
    public static boolean testOpenRouterConnection(String apiKey, String baseUrl, String model) {
        try {
            log.info("开始测试OpenRouter API连接...");
            log.info("API Key: {}***", StrUtil.isBlank(apiKey) ? "未配置" : apiKey.substring(0, Math.min(10, apiKey.length())));
            log.info("Base URL: {}", baseUrl);
            log.info("Model: {}", model);

            // 构建简单的测试请求
            Map<String, Object> requestBody = buildTestRequestBody(model);

            // 发送HTTP请求
            HttpResponse response = HttpRequest.post(baseUrl + "/chat/completions")
                    .header("Authorization", "Bearer " + apiKey)
                    .header("Content-Type", "application/json")
                    .header("HTTP-Referer", "https://reading-app.com")
                    .header("X-Title", "Reading App AI Service Test")
                    .body(JSONUtil.toJsonStr(requestBody))
                    .timeout(30000)
                    .execute();

            log.info("响应状态码: {}", response.getStatus());
            log.info("响应内容: {}", response.body());

            if (response.isOk()) {
                // 解析响应
                String responseBody = response.body();
                JSONObject jsonResponse = JSONUtil.parseObj(responseBody);

                if (jsonResponse.containsKey("choices") && !jsonResponse.getJSONArray("choices").isEmpty()) {
                    log.info("✅ OpenRouter API连接测试成功！");
                    return true;
                } else {
                    log.error("❌ OpenRouter API响应格式异常");
                    return false;
                }
            } else {
                log.error("❌ OpenRouter API连接失败，状态码：{}，响应：{}", response.getStatus(), response.body());
                
                // 提供具体的错误分析
                if (response.getStatus() == 401) {
                    log.error("🔑 认证失败：API Key可能无效或过期");
                } else if (response.getStatus() == 429) {
                    log.error("⏰ 请求频率过高：请稍后重试");
                } else if (response.getStatus() == 500) {
                    log.error("🔧 服务器内部错误：OpenRouter服务可能暂时不可用");
                }
                
                return false;
            }

        } catch (Exception e) {
            log.error("❌ OpenRouter API连接测试异常", e);
            return false;
        }
    }

    /**
     * 构建测试请求体
     */
    private static Map<String, Object> buildTestRequestBody(String model) {
        List<Map<String, String>> messages = new ArrayList<>();

        // 系统提示
        Map<String, String> systemMessage = new HashMap<>();
        systemMessage.put("role", "system");
        systemMessage.put("content", "你是一个AI助手，请简单回复'测试成功'。");
        messages.add(systemMessage);

        // 用户输入
        Map<String, String> userMessage = new HashMap<>();
        userMessage.put("role", "user");
        userMessage.put("content", "这是一个连接测试");
        messages.add(userMessage);

        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("model", model);
        requestBody.put("messages", messages);
        requestBody.put("max_tokens", 50); // 限制token数量，节省费用

        return requestBody;
    }

    /**
     * 获取可用的模型列表
     */
    public static List<String> getAvailableFreeModels() {
        List<String> models = new ArrayList<>();
        // 推荐的高质量模型
        models.add("openrouter/horizon-beta"); // 当前使用的模型
        models.add("deepseek/deepseek-chat-v3-0324:free");
        models.add("meta-llama/llama-3.2-3b-instruct:free");
        models.add("microsoft/phi-3-mini-128k-instruct:free");
        models.add("google/gemma-2-9b-it:free");
        models.add("mistralai/mistral-7b-instruct:free");
        return models;
    }

    /**
     * 测试多个模型的可用性
     */
    public static void testMultipleModels(String apiKey, String baseUrl) {
        List<String> models = getAvailableFreeModels();
        log.info("开始测试多个模型的可用性...");
        
        for (String model : models) {
            log.info("测试模型: {}", model);
            boolean success = testOpenRouterConnection(apiKey, baseUrl, model);
            if (success) {
                log.info("✅ 模型 {} 可用", model);
            } else {
                log.warn("❌ 模型 {} 不可用", model);
            }
            
            // 避免请求过于频繁
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
}
